/**
 * 将时间戳转换为指定格式的日期字符串
 * 
 * @param {number} timestamp - 时间戳，可以是秒级或毫秒级
 * @param {string} format - 日期格式，例如 'YYYY-MM-DD HH:mm:ss'
 * @returns {string} 格式化后的日期字符串
 * @throws {Error} 如果参数无效则抛出错误
 */
export function formatTimestamp(timestamp, format = "YYYY-MM-DD HH:mm") {

  if (!timestamp) {
    console.error('时间戳不能为空');
    return "";
  }

  // 判断时间戳是秒级还是毫秒级
  if (timestamp.toString().length === 10) {
    timestamp *= 1000; // 将秒级时间戳转换为毫秒级
  } else if (timestamp.toString().length !== 13) {
    console.error('时间戳长度不正确，应为10位（秒级）或13位（毫秒级）');
    console.error([timestamp,format])
    // console.log('======1222223123123=======')
    return '';
  }

  // 创建日期对象
  const date = new Date(timestamp);

  // 定义格式化函数
  const formatDate = (date, format) => {
    const map = {
      'YYYY': date.getFullYear(),
      'MM': ('0' + (date.getMonth() + 1)).slice(-2),
      'DD': ('0' + date.getDate()).slice(-2),
      'HH': ('0' + date.getHours()).slice(-2),
      'mm': ('0' + date.getMinutes()).slice(-2),
      'ss': ('0' + date.getSeconds()).slice(-2),
      'SSS': ('00' + date.getMilliseconds()).slice(-3)
    };

    return format.replace(/YYYY|MM|DD|HH|mm|ss|SSS/g, matched => map[matched]);
  };
  // 返回格式化后的日期字符串
  return formatDate(date, format);
}

/**
 * 格式化日期
 * @param {Date | string} date - 需要格式化的日期，支持Date对象或字符串
 * @param {string} format - 格式化的输出格式（默认 'YYYY-MM-DD HH:mm'）
 * @returns {string} - 格式化后的日期字符串
 */
export function formatDateV1(date, format = 'YYYY-MM-DD HH:mm') {
  // 安全校验：检查传入的日期是否为空或无效
  if (!date) {
    console.error('日期不能为空');
    return '';
  }

  // 如果传入的不是Date对象，尝试将其转换为Date
  let d = new Date(date);
  if (isNaN(d.getTime())) {
    console.error('无效的日期格式');
    return '';
  }

  const map = {
    'YYYY': d.getFullYear(),
    'MM': ('0' + (d.getMonth() + 1)).slice(-2), // 月份从0开始，因此需要+1
    'DD': ('0' + d.getDate()).slice(-2),
    'HH': ('0' + d.getHours()).slice(-2),
    'mm': ('0' + d.getMinutes()).slice(-2),
    'ss': ('0' + d.getSeconds()).slice(-2)
  };

  // 替换格式字符串中的各部分
  return format.replace(/YYYY|MM|DD|HH|mm|ss/g, (matched) => map[matched]);
}





// 时间格式转换 date=>hh:mm
export function formatTimeHm(date) {
  console.log(date, 'date')
  // 提取小时和分钟
  const hours = date.getHours();
  const minutes = date.getMinutes();
  // 格式化小时和分钟，确保是两位数
  const formattedHours = hours < 10 ? `0${hours}` : hours;
  const formattedMinutes = minutes < 10 ? `0${minutes}` : minutes;
  // 拼接成 hh:mm 格式
  return `${formattedHours}:${formattedMinutes}`;
}

// 日期格式转时间戳
export function dateToTimestamp(dateStr, type = 's') {
  const timestamp = new Date(dateStr).getTime();

  if (type === 'm') {
    return timestamp; // 返回毫秒级时间戳
  } else if (type === 's') {
    return Math.floor(timestamp / 1000); // 返回秒级时间戳
  } else {
    throw new Error('Invalid type! Use "seconds" or "milliseconds".');
  }
}



// 时间格式转换 date=>hh:mm
export function formatTimeHhMm(date) {
  // 提取小时和分钟
  const hours = date.getHours();
  const minutes = date.getMinutes();
  // 格式化小时和分钟，确保是两位数
  const formattedHours = hours < 10 ? `0${hours}` : hours;
  const formattedMinutes = minutes < 10 ? `0${minutes}` : minutes;
  // 拼接成 hh:mm 格式
  return `${formattedHours}:${formattedMinutes}`;
}


//  时间格式转换 hh:mm=>date
export function parseMmDdDate(timeString) {
  const [hours, minutes] = timeString.split(":").map(Number);
  // 使用当前日期，并将时间设置为传入的时间
  const now = new Date();
  now.setHours(hours, minutes, 0, 0); // 设置小时、分钟，秒和毫秒为 0
  return now;
}



/** 获取指定天数前的日期
 * @param {number} days - 需要回溯的天数（默认为7天前）
 * @returns {Date|null} 返回一个 Date 对象表示指定天数前的日期，若输入无效则返回 null
 */
export function getDateDaysAgo(days = 7) {
  // 校验输入是否为有效数字
  if (typeof days !== 'number' || isNaN(days) || days < 0) {
    console.warn('Invalid input: "days" must be a non-negative number.');
    return null;
  }
  // 获取当前日期
  const date = new Date();
  // 计算指定天数前的日期
  date.setDate(date.getDate() - days);
  return date;
}


/** 传入date格式 返回时间戳 */
export function getStartOfDayTimestamp(date) {
  // 确保传入的是 Date 对象
  if (!(date instanceof Date)) {
    throw new Error("Invalid input: Expected a Date object");
  }
  // 创建一个新的 Date 对象，并将时间设置为当天的零点
  const startOfDay = new Date(date);
  startOfDay.setHours(0, 0, 0, 0);
  // 返回秒级时间戳
  return Math.floor(startOfDay.getTime() / 1000);
}

// 传入日期数组 转成日期数组
export function parseTimeArray(arr) {
  var new_arr = [];
  for (var a = 0; a < arr.length; a++) {
    new_arr.push(parseTime(arr[a]));
  }
  return new_arr;
}


// 日期转换
export function parseTime(timeString) {
  const [hours, minutes] = timeString.split(":").map(Number);
  // 使用当前日期，并将时间设置为传入的时间
  const now = new Date();
  now.setHours(hours, minutes, 0, 0); // 设置小时、分钟，秒和毫秒为 0
  return now;
}

